int _cdecl
main(int argc, char * argv[])
{
NTSTATUS status;
OBJECT_ATTRIBUTES objectAttributes;
WCHAR unicodeName[MAX_PATH];
UCHAR SecurityDescriptorBuffer[512];
UNICODE_STRING nameString;
IO_STATUS_BLOCK ioStatusBlock;
ULONG lengthNeeded;
HANDLE fileHandle;
if (argc < 2) {
printf("usage: %s file\n", argv[0]);
return -1;
}
mbstowcs(unicodeName, argv[1], strlen(argv[1]) + 1);
RtlDosPathNameToNtPathName_U(
unicodeName,
&nameString,
NULL,
NULL);
InitializeObjectAttributes(
&objectAttributes,
&nameString,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
status = NtOpenFile(
&fileHandle,
READ_CONTROL,
&objectAttributes,
&ioStatusBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE,
0);
if (!NT_SUCCESS(status) || !NT_SUCCESS(ioStatusBlock.Status)) {
printf("%s: NtOpenFile on %wZ failed %lx %lx\n", argv[0], &nameString, status, ioStatusBlock.Status);
return -1;
}
//
// Now read the DACL from the server file.
//
status = NtQuerySecurityObject(
fileHandle,
DACL_SECURITY_INFORMATION,
(PSECURITY_DESCRIPTOR)SecurityDescriptorBuffer,
sizeof(SecurityDescriptorBuffer),
&lengthNeeded);
if (!NT_SUCCESS(status)) {
printf("%s: NtQuerySecurityObject on %wZ failed %lx %lx\n", argv[0], &nameString, status, lengthNeeded);
return -1;
}
DumpSecurityDescriptor((PSECURITY_DESCRIPTOR)SecurityDescriptorBuffer);
return 0;
}
Hate to admit it but c can be pretty beautiful sometimes.